/**
 * 机器翻译2.0(niutrans) WebAPI 接口调用示例
 * 运行前：请先填写Appid、APIKey、APISecret
 * 运行方法：直接运行 main() 即可 
 * 结果： 控制台输出结果信息
 * 
 * 1.接口文档（必看）：https://www.xfyun.cn/doc/nlp/niutrans/API.html
 * 2.错误码链接：https://www.xfyun.cn/document/error-code （错误码code为5位数字）
 * 3.个性化翻译术语自定义：
 * ***登陆开放平台 https://www.xfyun.cn/
 * ***在控制台--机器翻译(niutrans)--自定义翻译处
 * ***上传自定义翻译文件（打开上传或更新窗口，可下载示例文件）
 * @author iflytek
 */
const CryptoJS = require('crypto-js')
const { readFileSync, writeFileSync } = require('node:fs')

// 系统配置
const config = {
  // 请求地址
  hostUrl: "https://ntrans.xfyun.cn/v2/ots",
  host: "ntrans.xfyun.cn",
  //在控制台-我的应用-机器翻译获取
  appid: "31c87760",
  //在控制台-我的应用-机器翻译获取
  apiSecret: "Y2VmODhhMDZjYzY3ODUzMWM5YmExMmE5",
  //在控制台-我的应用-机器翻译获取
  apiKey: "2305e2229192b92e7110f0d18495ff8e",
  uri: "/v2/ots"
}

let transVar = {
  from: "cn",//源语种
  to: "en"//目标语种
}

// 生成请求body
function getPostBody(text, from, to) {
  let digestObj = {
    //填充common
    common: {
      app_id: config.appid
    },
    //填充business
    business: {
      from: from,
      to: to
    },
    //填充data
    data: {
      text: CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))
    }
  }
  return digestObj
}

// 请求获取请求体签名
function getDigest(body) {
  return 'SHA-256=' + CryptoJS.enc.Base64.stringify(CryptoJS.SHA256(JSON.stringify(body)))
}

// 鉴权签名
function getAuthStr(date, digest) {
  let signatureOrigin = `host: ${config.host}\ndate: ${date}\nPOST ${config.uri} HTTP/1.1\ndigest: ${digest}`
  let signatureSha = CryptoJS.HmacSHA256(signatureOrigin, config.apiSecret)
  let signature = CryptoJS.enc.Base64.stringify(signatureSha)
  let authorizationOrigin = `api_key="${config.apiKey}", algorithm="hmac-sha256", headers="host date request-line digest", signature="${signature}"`
  return authorizationOrigin
}

// 发送请求
const translate = async (text) => {
  // 获取当前时间 RFC1123格式
  let date = (new Date().toUTCString())
  let postBody = getPostBody(text, transVar.from, transVar.to)
  let digest = getDigest(postBody)

  let options = {
    url: config.hostUrl,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json,version=1.0',
      'Host': config.host,
      'Date': date,
      'Digest': digest,
      'Authorization': getAuthStr(date, digest)
    },
    // json: true,
    body: JSON.stringify(postBody)
  }
  console.log('正在翻译', text);
  const res = (await fetch(config.hostUrl, options).catch(err => {
    console.error('err', err);
  }))
  return (await res.json())?.data?.result?.trans_result?.dst
}
const batchTranslate = async () => {
  const fileContent = JSON.parse(readFileSync('locales/zh.json', 'utf-8'))
  const translated = JSON.parse(readFileSync('locales/en.json', 'utf-8'))
  const keys = Object.keys(fileContent)
  while (keys.length) {
    const key = keys.shift()
    if (!translated[key]) {
      translated[key] = await translate(fileContent[key])
    }
  }
  console.log("🚀 ~ batchTranslate ~   temp[key]:", translated)
  writeFileSync('locales/en.json', JSON.stringify(translated, null, 2))
}

batchTranslate()